//
//  LNHomeTableViewController.swift
//  727-黑马08微博-测试
//
//  Created by apple on 15/7/28.
//  Copyright © 2015年 itheima. All rights reserved.
//

import UIKit

class LNHomeTableViewController: BaseTableViewController {
    
/// 微博数据数组
    var statuses: [LNStatus]? {
        didSet {
//            刷新数据
            tableView.reloadData()
        }
    
    }

    override func viewDidLoad() {
        super.viewDidLoad()
//        如果用户没有登录，设置访客视图，返回
        if !LNUserAccount.userLogon {
            visitorView?.setupViewInfo(true, imageName: "visitordiscover_feed_image_smallicon", message: "关注一些人，回这里看看有什么惊喜")
            return
        }
//        测试代码，刷新控件，高度是60
//        refreshControl = UIRefreshControl()
//        测试添加视图
//        let v = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 20))
//        v.backgroundColor = UIColor.redColor()
//        refreshControl?.addSubview(v)
//        隐藏默认的转轮
//        refreshControl?.tintColor = UIColor.clearColor()
//        添加监听方法
//        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        prepareTableView()
        loadData()
        
    }
    
/// 准备表格视图
  private   func prepareTableView() {
//        注册原型cell
        tableView.registerClass(LNStatusNormalCell.self, forCellReuseIdentifier: StatusCellIdentifier.NormalCell.rawValue)
        tableView.registerClass(LNStatusForwardCell.self, forCellReuseIdentifier: StatusCellIdentifier.ForwardCell.rawValue)
//        设置表格的预估行高
        tableView.estimatedRowHeight = 300
//        设置表格自动计算行高
//        tableView.rowHeight = UITableViewAutomaticDimension
        
//        取消分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
//        刷新控件
        refreshControl = LNRefreshControl()
//        添加监听方法
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
    }
    
    
    ///上拉刷新标记
    private var pullupRefreshFlag = false
/// 加载数据
    func loadData() {
        refreshControl?.beginRefreshing()
//        刷新数据，获取到数组中第一条记录的id
//        第一次执行此方法的时候，status为空since_id = 0,加载最新的20条记录
        var since_id = statuses?.first?.id ?? 0
//        判断是否是上拉刷新
        var max_id = 0
        if pullupRefreshFlag {
            since_id  = 0
//            记录数组后一条记录的id
            max_id = statuses?.last?.id ?? 0
            
        }
       LNStatus.loadStatus(since_id, max_id: max_id) {(dataList, error) -> () in
        self.refreshControl?.endRefreshing()
        //            复位上拉刷新标记，保证下一次仍然能够上拉
        self.pullupRefreshFlag = false
//        print(dataList)
        if error != nil {
            print(error)
            return
        }
        
        let count = dataList?.count ?? 0
        print("刷新到\(count)条数据")
//        只有下拉刷新才需要提示
        if since_id > 0 {
            self.showPulldownTip(count)
        } 
//       如果没有数据，直接返回
        if count == 0 {
            return
        }
        if since_id > 0 {
//            做下拉刷新，应该将结果集合放在之前数组的前面
            self.statuses = dataList! + self.statuses!
            
        } else if max_id > 0 {
//            做上拉刷新，应该将结果集合放在数组的后面
        self.statuses! += dataList!

        } else {
            self.statuses = dataList
        }
        
        
        
        }
    }
    
    /// 显示下拉刷新的数据条数
    private func showPulldownTip(count: Int) {
        print(tipLabel.layer.animationKeys())
        if tipLabel.layer.animationForKey("position") != nil {
            print("动画正在执行中....")
            return
        }
      
//    定义标签文字
        tipLabel.text = (count == 0) ? "暂时没有新的微博" : "刷新到\(count)条微博"
//        标签的初始位置
        let rect = tipLabel.frame
        UIView.animateWithDuration(2.0, animations: { () -> Void in
//            自动反转动画
            UIView.setAnimationRepeatAutoreverses(true)
//            移动label的位置
            self.tipLabel.frame = CGRectOffset(rect, 0, 3 * rect.height)
            
            }) { (_) -> Void in
//                将标签复位
                self.tipLabel.frame = rect
        }
    }
    
    
    
    
//  MARK: - 数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuses?.count ?? 0
    }
//    每次要显示cell的时候，会调用此方法，根据indexPath判断数据方法
//    如果indexPath == 微博数组的总数 - 1,表示要显示最后一行了
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//      根据微博类型，选取不同的ID
        let status = statuses![indexPath.row]
        //        要求必须注册原型cell, storyboard, register Class
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status), forIndexPath: indexPath) as! LNStatusCell
//        cell.textLabel?.text = statuses![indexPath.row].text
//        判断indexPath的数值
        if indexPath.row == statuses!.count - 1 {
//            设置上拉刷新标记
            pullupRefreshFlag = true
//            刷新数据
            loadData()
        }
        cell.status = statuses![indexPath.row]
        return cell
        
    }
//    返回行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
//        判断模型中，是否已经缓存了行高
        
//      1.获取模型
        let status = statuses![indexPath.row]
        if let h = status.rowHeight {
            return h
        }
//        2.返回cell
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status)) as? LNStatusCell
//      3.记录并返回计算的行高
        status.rowHeight = cell!.rowHeight(status)
        return status.rowHeight!
        
        
    }
// MARK: - 懒加载
    private lazy var tipLabel: UILabel = {
        let h: CGFloat = 44
        let label = UILabel(frame: CGRect(x: 0, y: -2 * h, width: self.view.bounds.width, height: h))
        label.backgroundColor = UIColor.orangeColor()
        label.textColor = UIColor.whiteColor()
        label.textAlignment = NSTextAlignment.Center
//        加载navBar上面，不会随着tableView一起滚动
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
    }()
  
}





































